package com.fulihui.usercore.dal.mapper;

import com.fulihui.usercore.dal.dataobj.UserDO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * usr_user 表数据库操作映射
 *
 * @author Willard.Hu on 2016/5/17.
 */
public interface UserMapper {

    /**
     * 插入用户信息
     *
     * @param userDO {@link UserDO}
     */
    void insert(UserDO userDO);

    /**
     * 更新用户信息
     *
     * @param userDO {@link UserDO}
     * @return 数据库更新结果
     */
    boolean update(UserDO userDO);

    /**
     * 更新用户状态
     *
     * @param state  状态值 {@link com.fulihui.usercore.enums.UserStateEnum#getCode()}
     * @param userId 用户唯一标识
     * @return 更新结果
     */
    boolean updateState(@Param("state") String state, @Param("userId") String userId);

    /**
     * 通过用户唯一标识查询用户信息
     *
     * @param userId 用户唯一标识
     * @return 用户数据库模型 {@link UserDO}
     */
    UserDO queryByPK(String userId);

    /**
     * 通过用户唯一标识列表查询用户信息列表
     *
     * @param userIds 用户唯一标识列表
     * @return 用户数据库模型列表 {@link UserDO}
     */
    List<UserDO> queryByUserIds(@Param("userIds") List<String> userIds);

    /**
     * 用户昵称模糊查询
     *
     * @param nickname 昵称
     * @return 查询到的结果 {@link UserDO}
     */
    List<UserDO> queryByNickname(@Param("nickname") String nickname);

    /**
     * 按条件分页查询用户
     *
     * @param start             分页起始数
     * @param rows              数据行数
     * @param mobileNo          手机号
     * @param encryptMoibleNo   加密的手机号
     * @param province          省份
     * @param city              城市
     * @param tagId             标签id
     * @param registerSource    注册来源
     * @param registerStartDate 注册起始时间
     * @param registerEndDate   注册结束时间
     * @return 用户列表
     */
    List<UserDO> queryPage(@Param("start") int start,
                           @Param("rows") int rows,
                           @Param("mobileNo") String mobileNo,
                           @Param("encryptMoibleNo") String encryptMoibleNo,
                           @Param("province") String province,
                           @Param("city") String city,
                           @Param("tagId") String tagId,
                           @Param("registerSource") String registerSource,
                           @Param("registerStartDate") Date registerStartDate,
                           @Param("registerEndDate") Date registerEndDate,
                           @Param("state") String state);

    /**
     * 按条件统计用户数量
     *
     * @param mobileNo          手机号
     * @param encryptMoibleNo   加密的手机号
     * @param province          省份
     * @param city              城市
     * @param tagId             标签id
     * @param registerSource    注册来源
     * @param registerStartDate 注册起始时间
     * @param registerEndDate   注册结束时间
     * @return 统计的数量
     */
    long totalCount(@Param("mobileNo") String mobileNo,
                    @Param("encryptMoibleNo") String encryptMoibleNo,
                    @Param("province") String province,
                    @Param("city") String city,
                    @Param("tagId") String tagId,
                    @Param("registerSource") String registerSource,
                    @Param("registerStartDate") Date registerStartDate,
                    @Param("registerEndDate") Date registerEndDate,
                    @Param("state") String state);
}
